﻿using System;
using System.Collections.Generic;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Linq;

namespace PoshBoard.VisualDesigner.Controls
{
    public static class ColorHelper
    {
        /// <summary>
        /// Dictionnary containing all colors reference String/uInt
        /// </summary>
        /// <returns>uInt colorRef</returns>
        public static Dictionary<string, uint> GetColorRef()
        {
            var colorsRef = new Dictionary<string, uint>(StringComparer.InvariantCultureIgnoreCase)
                                {
                                    {"AliceBlue", 0xFFF0F8FF},
                                    {"AntiqueWhite", 0xFFFAEBD7},
                                    {"Aqua", 0xFF00FFFF},
                                    {"Aquamarine", 0xFF7FFFD4},
                                    {"Azure", 0xFFF0FFFF},
                                    {"Beige", 0xFFF5F5DC},
                                    {"Bisque", 0xFFFFE4C4},
                                    {"Black", 0xFF000000},
                                    {"BlanchedAlmond", 0xFFFFEBCD},
                                    {"Blue", 0xFF0000FF},
                                    {"BlueViolet", 0xFF8A2BE2},
                                    {"Brown", 0xFFA52A2A},
                                    {"BurlyWood", 0xFFDEB887},
                                    {"CadetBlue", 0xFF5F9EA0},
                                    {"Chartreuse", 0xFF7FFF00},
                                    {"Chocolate", 0xFFD2691E},
                                    {"Coral", 0xFFFF7F50},
                                    {"CornflowerBlue", 0xFF6495ED},
                                    {"Cornsilk", 0xFFFFF8DC},
                                    {"Crimson", 0xFFDC143C},
                                    {"Cyan", 0xFF00FFFF},
                                    {"DarkBlue", 0xFF00008B},
                                    {"DarkCyan", 0xFF008B8B},
                                    {"DarkGoldenrod", 0xFFB8860B},
                                    {"DarkGray", 0xFFA9A9A9},
                                    {"DarkGreen", 0xFF006400},
                                    {"DarkKhaki", 0xFFBDB76B},
                                    {"DarkMagenta", 0xFF8B008B},
                                    {"DarkOliveGreen", 0xFF556B2F},
                                    {"DarkOrange", 0xFFFF8C00},
                                    {"DarkOrchid", 0xFF9932CC},
                                    {"DarkRed", 0xFF8B0000},
                                    {"DarkSalmon", 0xFFE9967A},
                                    {"DarkSeaGreen", 0xFF8FBC8F},
                                    {"DarkSlateBlue", 0xFF483D8B},
                                    {"DarkSlateGray", 0xFF2F4F4F},
                                    {"DarkTurquoise", 0xFF00CED1},
                                    {"DarkViolet", 0xFF9400D3},
                                    {"DeepPink", 0xFFFF1493},
                                    {"DeepSkyBlue", 0xFF00BFFF},
                                    {"DimGray", 0xFF696969},
                                    {"DodgerBlue", 0xFF1E90FF},
                                    {"Firebrick", 0xFFB22222},
                                    {"FloralWhite", 0xFFFFFAF0},
                                    {"ForestGreen", 0xFF228B22},
                                    {"Fuchsia", 0xFFFF00FF},
                                    {"Gainsboro", 0xFFDCDCDC},
                                    {"GhostWhite", 0xFFF8F8FF},
                                    {"Gold", 0xFFFFD700},
                                    {"Goldenrod", 0xFFDAA520},
                                    {"Gray", 0xFF808080},
                                    {"Green", 0xFF008000},
                                    {"GreenYellow", 0xFFADFF2F},
                                    {"Honeydew", 0xFFF0FFF0},
                                    {"HotPink", 0xFFFF69B4},
                                    {"IndianRed", 0xFFCD5C5C},
                                    {"Indigo", 0xFF4B0082},
                                    {"Ivory", 0xFFFFFFF0},
                                    {"Khaki", 0xFFF0E68C},
                                    {"Lavender", 0xFFE6E6FA},
                                    {"LavenderBlush", 0xFFFFF0F5},
                                    {"LawnGreen", 0xFF7CFC00},
                                    {"LemonChiffon", 0xFFFFFACD},
                                    {"LightBlue", 0xFFADD8E6},
                                    {"LightCoral", 0xFFF08080},
                                    {"LightCyan", 0xFFE0FFFF},
                                    {"LightGoldenrodYellow", 0xFFFAFAD2},
                                    {"LightGray", 0xFFD3D3D3},
                                    {"LightGreen", 0xFF90EE90},
                                    {"LightPink", 0xFFFFB6C1},
                                    {"LightSalmon", 0xFFFFA07A},
                                    {"LightSeaGreen", 0xFF20B2AA},
                                    {"LightSkyBlue", 0xFF87CEFA},
                                    {"LightSlateGray", 0xFF778899},
                                    {"LightSteelBlue", 0xFFB0C4DE},
                                    {"LightYellow", 0xFFFFFFE0},
                                    {"Lime", 0xFF00FF00},
                                    {"LimeGreen", 0xFF32CD32},
                                    {"Linen", 0xFFFAF0E6},
                                    {"Magenta", 0xFFFF00FF},
                                    {"Maroon", 0xFF800000},
                                    {"MediumAquamarine", 0xFF66CDAA},
                                    {"MediumBlue", 0xFF0000CD},
                                    {"MediumOrchid", 0xFFBA55D3},
                                    {"MediumPurple", 0xFF9370DB},
                                    {"MediumSeaGreen", 0xFF3CB371},
                                    {"MediumSlateBlue", 0xFF7B68EE},
                                    {"MediumSpringGreen", 0xFF00FA9A},
                                    {"MediumTurquoise", 0xFF48D1CC},
                                    {"MediumVioletRed", 0xFFC71585},
                                    {"MidnightBlue", 0xFF191970},
                                    {"MintCream", 0xFFF5FFFA},
                                    {"MistyRose", 0xFFFFE4E1},
                                    {"Moccasin", 0xFFFFE4B5},
                                    {"NavajoWhite", 0xFFFFDEAD},
                                    {"Navy", 0xFF000080},
                                    {"OldLace", 0xFFFDF5E6},
                                    {"Olive", 0xFF808000},
                                    {"OliveDrab", 0xFF6B8E23},
                                    {"Orange", 0xFFFFA500},
                                    {"OrangeRed", 0xFFFF4500},
                                    {"Orchid", 0xFFDA70D6},
                                    {"PaleGoldenrod", 0xFFEEE8AA},
                                    {"PaleGreen", 0xFF98FB98},
                                    {"PaleTurquoise", 0xFFAFEEEE},
                                    {"PaleVioletRed", 0xFFDB7093},
                                    {"PapayaWhip", 0xFFFFEFD5},
                                    {"PeachPuff", 0xFFFFDAB9},
                                    {"Peru", 0xFFCD853F},
                                    {"Pink", 0xFFFFC0CB},
                                    {"Plum", 0xFFDDA0DD},
                                    {"PowderBlue", 0xFFB0E0E6},
                                    {"PowerShellBlue", 0xFF012456},
                                    {"Purple", 0xFF800080},
                                    {"Red", 0xFFFF0000},
                                    {"RosyBrown", 0xFFBC8F8F},
                                    {"RoyalBlue", 0xFF4169E1},
                                    {"SaddleBrown", 0xFF8B4513},
                                    {"Salmon", 0xFFFA8072},
                                    {"SandyBrown", 0xFFF4A460},
                                    {"SeaGreen", 0xFF2E8B57},
                                    {"SeaShell", 0xFFFFF5EE},
                                    {"Sienna", 0xFFA0522D},
                                    {"Silver", 0xFFC0C0C0},
                                    {"SkyBlue", 0xFF87CEEB},
                                    {"SlateBlue", 0xFF6A5ACD},
                                    {"SlateGray", 0xFF708090},
                                    {"Snow", 0xFFFFFAFA},
                                    {"SpringGreen", 0xFF00FF7F},
                                    {"SteelBlue", 0xFF4682B4},
                                    {"Tan", 0xFFD2B48C},
                                    {"Teal", 0xFF008080},
                                    {"Thistle", 0xFFD8BFD8},
                                    {"Tomato", 0xFFFF6347},
                                    {"Transparent", 0x00FFFFFF},
                                    {"Turquoise", 0xFF40E0D0},
                                    {"Violet", 0xFFEE82EE},
                                    {"Wheat", 0xFFF5DEB3},
                                    {"White", 0xFFFFFFFF},
                                    {"WhiteSmoke", 0xFFF5F5F5},
                                    {"Yellow", 0xFFFFFF00},
                                    {"YellowGreen", 0xFF9ACD32}
                                };
            return colorsRef;
        }

        /// <summary>
        /// Transform a string into a valid Color for WPF/Silverlight
        /// </summary>
        /// <param name="color">a string representing a valid color</param>
        /// <returns>this return a Color.FromArgb</returns>
        public static Color GetColor(string color)
        {
            Dictionary<string, uint> colorsref = GetColorRef();
            uint value = colorsref[color];

            return Color.FromArgb(
                (byte)(value >> 24),
                (byte)(value >> 16),
                (byte)(value >> 8),
                (byte)value);
        }

        public static Color GetColorFromHexString(string s)
        {
            s = s.Replace("#", "");
            byte a = Convert.ToByte(s.Substring(0, 2), 16);
            byte r = Convert.ToByte(s.Substring(2, 2), 16);
            byte g = Convert.ToByte(s.Substring(4, 2), 16);
            byte b = Convert.ToByte(s.Substring(6, 2), 16);
            return Color.FromArgb(a, r, g, b);
        }



        /// <summary>
        /// Tentative ratée d'aproximation de couleur.
        /// </summary>
        /// <param name="inputColor"></param>
        /// <returns></returns>
        public static string GetBrushesNameByString(string inputColor)
        {
            Color color = GetColorFromHexString(inputColor);

            int iGapPlus = 0;
            int iGapMinus = 0;
            Color colorTempPlus;
            Color colorTempMinus;

            List<byte> aCol = new List<byte>();
            List<byte> rCol = new List<byte>();
            List<byte> gCol = new List<byte>();
            List<byte> bCol = new List<byte>();

            foreach (uint iVal in GetColorRef().Values)
            {
                byte[] byteTab = BitConverter.GetBytes(iVal);
                aCol.Add(byteTab[3]);
            }

            iGapPlus = 0;             
            iGapMinus = 0;
            colorTempPlus = Color.FromArgb(color.A, color.R, color.G, color.B);
            colorTempMinus = Color.FromArgb(color.A, color.R, color.G, color.B);
            while (!aCol.Contains(colorTempPlus.A))
            {
                colorTempPlus.A = (byte)(colorTempPlus.A + 1);
                iGapPlus++;
            }
            while (!aCol.Contains(colorTempMinus.A))
            {
                colorTempMinus.A = (byte)(colorTempMinus.A - 1);
                iGapMinus++;
            }

            if (iGapPlus < iGapMinus)
                color = colorTempPlus;
            else
                color = colorTempMinus;





            foreach (uint iVal in GetColorRef().Values.Where(entry => BitConverter.GetBytes(entry)[3] == color.A))
            {
                byte[] byteTab = BitConverter.GetBytes(iVal);
                rCol.Add(byteTab[2]);
            }


            iGapPlus = 0;
            iGapMinus = 0;
            colorTempPlus = Color.FromArgb(color.A, color.R, color.G, color.B);
            colorTempMinus = Color.FromArgb(color.A, color.R, color.G, color.B);
            while (!rCol.Contains(colorTempPlus.R))
            {
                colorTempPlus.R = (byte)(colorTempPlus.R + 1);
                iGapPlus++;
            }
            while (!rCol.Contains(colorTempMinus.R))
            {
                colorTempMinus.R = (byte)(colorTempMinus.R - 1);
                iGapMinus++;
            }

            if (iGapPlus < iGapMinus)
                color = colorTempPlus;
            else
                color = colorTempMinus;





            foreach (uint iVal in GetColorRef().Values
                .Where(entry => BitConverter.GetBytes(entry)[3] == color.A)
                 .Where(entry => BitConverter.GetBytes(entry)[2] == color.R)
                )
            {
                byte[] byteTab = BitConverter.GetBytes(iVal);
                gCol.Add(byteTab[1]);
            }


            iGapPlus = 0;
            iGapMinus = 0;
            colorTempPlus = Color.FromArgb(color.A, color.R, color.G, color.B);
            colorTempMinus = Color.FromArgb(color.A, color.R, color.G, color.B);
            while (!gCol.Contains(colorTempPlus.G))
            {
                colorTempPlus.G = (byte)(colorTempPlus.G + 1);
                iGapPlus++;
            }
            while (!gCol.Contains(colorTempMinus.G))
            {
                colorTempMinus.G = (byte)(colorTempMinus.G - 1);
                iGapMinus++;
            }

            if (iGapPlus < iGapMinus)
                color = colorTempPlus;
            else
                color = colorTempMinus;

            foreach (uint iVal in GetColorRef().Values
                .Where(entry => BitConverter.GetBytes(entry)[3] == color.A)
                 .Where(entry => BitConverter.GetBytes(entry)[2] == color.R)
                 .Where(entry => BitConverter.GetBytes(entry)[1] == color.G)
    )
            {
                byte[] byteTab = BitConverter.GetBytes(iVal);
                bCol.Add(byteTab[0]);
            }


            iGapPlus = 0;
            iGapMinus = 0;
            colorTempPlus = Color.FromArgb(color.A, color.R, color.G, color.B);
            colorTempMinus = Color.FromArgb(color.A, color.R, color.G, color.B);
            while (!bCol.Contains(colorTempPlus.B))
            {
                colorTempPlus.B = (byte)(colorTempPlus.B + 1);
                iGapPlus++;
            }
            while (!bCol.Contains(colorTempMinus.B))
            {
                colorTempMinus.B = (byte)(colorTempMinus.B - 1);
                iGapMinus++;
            }

            if (iGapPlus < iGapMinus)
                color = colorTempPlus;
            else
                color = colorTempMinus;


            return GetColorRef().Where(entry => Color.FromArgb(
             BitConverter.GetBytes(entry.Value)[3],
            BitConverter.GetBytes(entry.Value)[2],
            BitConverter.GetBytes(entry.Value)[1],
             BitConverter.GetBytes(entry.Value)[0]) == color).First().Key;

        }

    }
}
